#ifndef _MULTICAST_STRUCT_DEFINE_H__
#define _MULTICAST_STRUCT_DEFINE_H__

#include "../complib/libtsmp/include/tsmp_api.h"
#include "../multicast_ctr_init/multicast_ctr_init.h"

#define MULTICAST_TABLE 0x43c20000 /*组播转发表*/

#define DROUTE_PORTBM 0x43c09024 /*动态路由端口寄存器*/
#define SROUTE_PORTBM 0x43c09025 /*静态路由端口寄存器*/
#define FORWARD_MODE 0x43c09026  /*转发模式寄存器*/

#define MAX_MULTICAST_ENTRY_NUM 8 /*组播表项数目*/
#define MAX_PORT_NUM 32           // 每个设备的最大端口数

// 定义数组最大值为10
#define MAX_TIMER_NUM 10

// 定义查询器的超时时间存储在数组的第0个元素
#define QUERIER_TIMEOUT_IDX 0

/* //定义抑制上报的超时时间存储在数组的第1个元素
#define REPORT_RESTRAIN_TIMEOUT_IDX 1 */

// 定义组播表项老化的超时时间存储在数组的第1个元素
#define TABLE_AGING_TIMEOUT_IDX 1
// 定义路由接口老化的超时时间存储在数组的第2个元素
#define ROUTE_PORT_AGING_TIMEOUT_IDX 2

// 老化计时器
typedef struct
{
  u64 time_cnt; // 老化计时器，单位ns
} aging_time_cnt_entry;

// 各个端口老化信息
typedef struct
{
  aging_time_cnt_entry *port_aging_time_info[MAX_PORT_NUM];
} aging_time_cnt;

// 每条组播表项信息
typedef struct
{
  u8 valid;                       // 有效位
  u8 type;                        // 类型，0表示动态表项，1表示静态表项
  u8 ip[4];                       // 组播地址
  u32 port;                       // 输出端口号
  aging_time_cnt aging_time_info; // 输出端口老化信息
} multicast_table_entry;

// 组播表
typedef struct
{
  u8 static_multicast_entry_size; // 静态组播表项数目
  multicast_table_entry *table[MAX_MULTICAST_ENTRY_NUM];
} multicast_table;

// 查询器相关信息
typedef struct
{
  u8 querier_enable;      // 查询器使能，1表示开启，0表示关闭
  u8 querier_maxresptime; // 最大响应时间（1-25），单位是秒
  u16 querier_period;     // 查询周期（10-300），单位是秒
  u16 querier_mid;        // 查询器节点id
  u8 querier_sip[4];      // 通用查询报文源IP
} querier;

// 路由接口信息
typedef struct
{
  u32 dynamic_route_port;         // 动态路由接口;
  aging_time_cnt aging_time_info; // 路由端口老化信息
} route_port;

// 静态配置参数信息
typedef struct
{
  u8 forward_mode;            // 转发模式，1表示丢弃，0表示转发
  u8 report_restrain_enbale;  // report抑制使能，1表示开启，0表示关闭
  u16 route_port_aging_time;  // 路由端口老化时间（60-600，推荐300秒），单位是秒
  u16 member_port_aging_time; // 成员端口老化时间（60-600，推荐300秒），单位是秒
  u32 static_route_port;      // 静态路由接口;
  u32 quickly_leave_port;     // 快速离开模式端口，对应32个输出端口的bitmap
} static_cfg_para;

// report抑制信息
typedef struct
{
  u64 time_cnt; // 老化计时器，单位ns
} report_restrain;

// 单个设备节点的配置校验信息
typedef struct
{
  u8 buf[2048];
  u32 check_flag; // buf中的数据是否需校验的标志，bitmap形式，每一bit对应1项数据是否需要校验，1代表需校验，0代表不需校验
} node_check;

// 单个设备节点组播信息
typedef struct
{
  static_cfg_para cfg_para_info;        // 单个设备节点的静态配置信息
  report_restrain report_restrain_info; // 单个设备节点的report抑制信息
  route_port route_port_info;           // 单个设备节点的路由接口信息
  multicast_table multicast_table_info; // 单个设备节点的组播表项信息
  node_check check_info;                // 单个设备节点的配置校验信息
} node_multicast;

// 全网设备节点组播信息
typedef struct
{
  querier querier_info;                                 // 查询器相关信息
  node_multicast *node_multicast_context[MAX_NODE_NUM]; // 设备节点组播信息
} multicast_context;

int register_init_cfg();
int update_table(int node_id, int table_id);
int update_port(int node_id);
unsigned short ip_csum(unsigned short *packet, int packlen);
void multicast_context_destory();

#endif
